using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.BulletX
{
	public class CylinderShapeZ : CylinderShape
	{
		public CylinderShapeZ(Vector3 halfExtents)
			: base(halfExtents) { }

		public override int UpAxis
		{
			get
			{
				return 2;
			}
		}

		public override float Radius
		{
			get
			{
				return HalfExtents.X;
			}
		}

		//debugging
		public override string Name
		{
			get
			{
				return "CylinderZ";
			}
		}

		public override Vector3 LocalGetSupportingVertexWithoutMargin(Vector3 vec)
		{
			return CylinderLocalSupportZ(HalfExtents, vec);
		}

		public override void BatchedUnitVectorGetSupportingVertexWithoutMargin(Vector3[] vectors, Vector3[] supportVerticesOut)
		{
			for (int i = 0; i < vectors.Length; i++)
			{
				supportVerticesOut[i] = CylinderLocalSupportZ(HalfExtents, vectors[i]);
			}
		}

		Vector3 CylinderLocalSupportZ(Vector3 halfExtents, Vector3 v)
		{
			//mapping depends on how cylinder local orientation is
			// extents of the cylinder is: X,Y is for radius, and Z for height
			float radius = halfExtents.X;
			float halfHeight = halfExtents.Z;

			Vector3 tmp = new Vector3();
			float d;

			float s = (float)Math.Sqrt(v.X * v.X + v.Y * v.Y);
			if (s != 0)
			{
				d = radius / s;
				tmp.X = v.X * d;
				tmp.Z = v.Z < 0 ? -halfHeight : halfHeight;
				tmp.Y = v.Y * d;
				return tmp;
			}
			else
			{
				tmp.X = radius;
				tmp.Z = v.Z < 0 ? -halfHeight : halfHeight;
				tmp.Y = 0;
				return tmp;
			}
		}
	}
}
